/**
 * @author ChaP
 * @date 2019/06/01
 * @describe:
 */
package CodingTest.AC20190601;

/**
 * leetcode - 468
 * 编写一个函数来验证输入的字符串是否是有效的 IPv4 或 IPv6 地址。

 IPv4 地址由十进制数和点来表示，每个地址包含4个十进制数，其范围为 0 - 255， 用(".")分割。比如，172.16.254.1；

 同时，IPv4 地址内的数不会以 0 开头。比如，地址 172.16.254.01 是不合法的。

 IPv6 地址由8组16进制的数字来表示，每组表示 16 比特。这些组数字通过 (":")分割。比如,  2001:0db8:85a3:0000:0000:8a2e:0370:7334 是一个有效的地址。而且，我们可以加入一些以 0 开头的数字，字母可以使用大写，也可以是小写。所以， 2001:db8:85a3:0:0:8A2E:0370:7334 也是一个有效的 IPv6 address地址 (即，忽略 0 开头，忽略大小写)。

 然而，我们不能因为某个组的值为 0，而使用一个空的组，以至于出现 (::) 的情况。 比如， 2001:0db8:85a3::8A2E:0370:7334 是无效的 IPv6 地址。

 同时，在 IPv6 地址中，多余的 0 也是不被允许的。比如， 02001:0db8:85a3:0000:0000:8a2e:0370:7334 是无效的。

 说明: 你可以认为给定的字符串里没有空格或者其他特殊字符。

 示例 1:

 输入: "172.16.254.1"

 输出: "IPv4"

 解释: 这是一个有效的 IPv4 地址, 所以返回 "IPv4"。
 示例 2:

 输入: "2001:0db8:85a3:0:0:8A2E:0370:7334"

 输出: "IPv6"

 解释: 这是一个有效的 IPv6 地址, 所以返回 "IPv6"。
 示例 3:

 输入: "256.256.256.256"

 输出: "Neither"

 解释: 这个地址既不是 IPv4 也不是 IPv6 地址。
 */
public class validIPAddress {
    public String validIPAddress(String IP){
        boolean result;
        for(int i = 0;i<IP.length();i++){
            if(IP.charAt(i) == '.'){
                result = judge4(IP);
                if(result) return "IPv4";
                else  return "Neither";
            }else if(IP.charAt(i) == ':'){
                result = judge6(IP);
                if(result) return "IPv6";
                else  return "Neither";
            }
        }
        return "Neither";
    }
    public boolean judge4(String s){
        String[] str = s.split("\\.");
        if(str.length !=4 || s.charAt(s.length()-1) == '.') return false;
        for(int i = 0;i<str.length;i++){
            if(str[i].length()<1 || str[i].length() >3) return false;
            else if(str[i].charAt(0) == '0' && str[i].length() >1) return false;
            for(int j=0;j<str[i].length();j++){
                if(str[i].charAt(j) >'9' || str[i].charAt(j) <'0'){
                    return false;
                }
            }
            int temp = Integer.valueOf(str[i]);
            if(temp>255) return false;
        }
        return true;
    }
    public boolean judge6(String s){
        String[] str = s.split(":");
        if(str.length !=8 || s.charAt(s.length()-1) == ':') return false;
        for(int i = 0;i < str.length;i++){
            if(str[i].length()>4 || str[i].length()==0) return false;
            for(int j = 0;j<str[i].length();j++){
                //十六进制数范围的限制：0-9 A-F a-f
                if(str[i].charAt(j)<'0' || str[i].charAt(j)>'f') return false;
                else if(str[i].charAt(j)>'9' && str[i].charAt(j)<'A') return false;
                else if(str[i].charAt(j)>'F'&& str[i].charAt(j)<'a') return false;
            }
        }

        return true;
    }

    public static void main(String[] args) {
        validIPAddress vl = new validIPAddress();
        String s =
                "192.0.0.1";
        System.out.println(vl.validIPAddress(s));
    }

}
